# coding:utf-8
import sys

import re
from flask import current_app, jsonify
from flask import g
from flask import request
from flask import session

from iHome import db
from iHome.constants import QINIU_DOMIN_PREFIX
from iHome.models import User, House
from iHome.utils.commons import login_required
from iHome.utils.image_storage import storage
from iHome.utils.response_code import RET

reload(sys)
sys.setdefaultencoding('utf-8')
from . import api


@api.route('/users/avatar', methods=['POST'])
@login_required
def upload_avater():
    """
    上传用户头像
    0.TODO判断用户是否登陆
    1.获取用户上传的图片
    2.效验图片
    3.将图片传到7牛云
    4.保存图片到数据库
    5.返回响应
    """
    try:
        # 1.获取用户上传的图片
        # 2.效验图片
        avatar_data = request.files.get('avatar').read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='读取文件失败')
    # 3.将图片传到7牛云
    try:
        key = storage(avatar_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='上传图片失败')
    # 4. 保存图片
    # User.query.filter_by(id=user_id).update({'avatar_url': image_name})
    try:
        user = User.query.filter_by(id=g.user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据库失败')

    if not user:
        return jsonify(errno=RET.NODATA, errmsg='该用户么有登陆')
    user.avatar_url = key
    # 保存到数据库
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.NODATA, errmsg='保存图片到数据库失败')
    # 返回响应
    avatar_url = QINIU_DOMIN_PREFIX + key
    return jsonify(errno=RET.OK, errmsg='上传成功!', data=avatar_url)


@api.route('/users')
@login_required
def get_user_info():
    # 判断是否登陆
    """
    用户中心页面
    需要数据：
    用户的头像
    用户的姓名

    :return:
    """
    user_id = g.user_id

    try:
        user = User.query.filter_by(id=user_id).first()
        print user
    except Exception as e:
        current_app.logger.error(e)

        return jsonify(errno=RET.NODATA, errmsg='查询数据库失败')
    # 获取useid
    if user is None:
        return jsonify(errno=RET.DBERR, errmsg='该用户没有登陆')
    # 组织数据
    # resp = {
    #     'user_id': user.id,
    #     'user_name': user.name,
    #     'user_mobile': user.mobile,
    #     'avatar_url': user.avatar_url
    # }
    # 返回响应
    # 直接在models中定义一个to_dict方法返回数据
    return jsonify(errno=RET.OK, errmsg='', data=user.to_dict())


@api.route('/users/name', methods=['PUT'])
@login_required  # 0.用户是否登陆
def update_name():
    """
    用户中心修改名字
    0.用户是否登陆
    1.获取前端name数据
    2.效验name
    3.数据查找user，更新name字段
    4.保存
    5.返回响应
    """
    # 1.获取前端name数据
    dict_data = request.get_json()
    name = dict_data.get('name')
    # 2.效验name
    if not name:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    user_id = g.user_id
    # 3.数据查找user，更新name字段
    try:
        User.query.filter_by(id=user_id).update({'name': name})
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户失败')
    # 4.保存
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='更新数据库失败')

    # 5.返回响应

    return jsonify(errno=RET.OK, errmsg='更新成功！')


@api.route('/users/auth', methods=['POST'])
@login_required  # 0.用户登陆认证
def setup_auth():
    """
    用户的实名认证
    0.用户登陆认证
    1.获取参数：real_name、id_card
    2.验证参数
    3.更新数据库
    4.保存
    5.返回响应
    :return:

    """

    # 1.获取参数：real_name、id_card
    dict_data = request.get_json()
    real_name = dict_data.get('real_name')
    id_card = dict_data.get('id_card')

    # 2.验证参数
    if not all([real_name, id_card]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # if not re.match(r'^([a-zA-Z0-9\u4e00-\u9fa5\·]{1,10})$', real_name):
    #     return jsonify(errno=RET.PARAMERR, errmsg='姓名格式错误')

    if not re.match(r'^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$', id_card):
        return jsonify(errno=RET.PARAMERR, errmsg='身份证格式错误')

    # 3.更新数据库\4.保存
    try:
        User.query.filter_by(id=g.user_id).update({'real_name': real_name, 'id_card': id_card})
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库更新失败')
    # 5.返回响应
    return jsonify(errno=RET.OK, errmsg='认证成功！')


@api.route('/users/auth', methods=['GET'])
@login_required
def get_auth():
    """
    获取用户实名认证信息
    :return:
    """
    user_id = g.user_id
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据查询错误')

    # 如果用户不存在
    if user is None:
        return jsonify(errno=RET.SESSIONERR, errmsg='用户不存在')

    return jsonify(errno=RET.OK, errmsg='OK', data=user.auth_to_dict())


@api.route('/users/houses')
@login_required
def user_houses():
    """
    房源
    0.用户登陆
    1.获取当前登陆用户的ID
    2.从数据库获取该ID的所有房源
    3.组织数据返回响应
    :return:
    """
    # 1.获取当前登陆用户的ID
    user_id = g.user_id

    # 2.从数据库获取该ID的所有房源
    try:
        houses = House.query.filter(House.user_id == user_id).all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据失败")
    # 3.在models中转换为字典格式
    house_li = []
    for house in houses:
        house_li.append(house.to_basic_dict())

    return jsonify(errno=RET.OK, errmsg="OK", data=house_li)
